package 多线程2;
//wait和notify

/**
 * wait,notify,notifyAll都是Object类的方法
 *
 * wait:等待
 * notify:通知
 * 用来协同两个线程之间的执行顺序(先后)
 *
 * "抢占式"其实就让两个线程执行的顺序关系,充满了不确定性...
 * 通过wait和notify机制就可以来控制线程之间的执行顺序.让多个线程之间更好的相互配合
 */

/**
 * wait做了三件事:
 * 1.让当前线程阻塞等待.(让这个线程的PCB从就绪队列拿到等待队列中),并准备接受通知(靠notify方法唤醒)
 * --
 * 2.释放当前锁.(给其他线程让路,完成工作)要想使用wait/notify,必须搭配synchronized.
 * 需要先获取到锁,才有资格谈wait
 * 3.满足一定的条件被唤醒时,重新尝试获取这个锁.
 *
 * //1和2是要原子的完成
 *
 * wait 结束等待的条件:
 * 其他线程调用该对象的 notify 方法.
 * wait 等待时间超时 (wait 方法提供一个带有 timeout 参数的版本, 来指定等待时间).
 * 其他线程调用该等待线程的 interrupted 方法, 导致 wait 抛出 InterruptedException 异常.
 */

/**
 * wait和notify都是Object的方法.
 * 比如线程1中的对象1调用了wait
 * 必须要有个线程2,也调用对象1的notify,才能唤醒线程1.
 * 如果是线程2,调用了对象2的notify,就无法唤醒线程1.
 * 唤醒的必须是等待的那个.
 */

/**
 * 关于notify的使用:
 * 1.也要放到synchronized中使用
 * 2.notify操作是一次唤醒一个线程.如果有多个线程都在等待中,
 * 调用notify相当于随机唤醒了.其他线程保持原状.
 * 3.调用notify这是通知对方被唤醒,但是调用notify本身的线程并不是立即释放锁,
 * 而是要等待当前的synchronized代码块执行完才能释放锁(notify本身不会释放锁)
 *
 */
public class TestDemo2 {
    public static void main(String[] args) throws InterruptedException {
        Object object = new Object();
        synchronized (object){
            System.out.println("wait之前");
            object.wait();
            System.out.println("wait之后");
        }
    }
}
